<?php

//print_r($_SERVER['HTTP_REFERER']);
class usuario_loginModel extends Model{
    protected $tabela = "usuario";
    protected $pkey   = "cod_usuario";
    private   $cookie = "usuario";
    private static $__cookie = "usuario";
    protected $dados = array(
        'cod_usuario' => array(
            'name'    => "Código do usuário",
            'pkey'    => true,
            'ai'      => true,
            'type'    => 'int',
            'display' => true,
            'size'    => '11',
            'grid'    => true,
            'private' => true,
            'notnull' => true
         ),
        
        'user_name' => array(
            'name'     => 'Nome',
            'type'     => 'varchar',
            'display'  => true,
            'size'     => '64',
            'notnull'  => true,
            'grid'     => true,
            'description' => "Digite o seu nome completo",
         ),
        
        'user_cargo' => array(
            'name'        => 'Cargo',
            'type'        => 'varchar',
            'display'     => true,
            'size'        => '64',
            'notnull'     => true,
            'grid'        => true,
            'description' => "Digite o papel exercido na empresa por você",
         ),
 
        'email' => array(
            'name'     => 'Email',
            'type'     => 'varchar',
            'display'  => true,
            'mobile_hide' => true,
            'unique'   => array('model' => 'usuario/login'),
            'size'     => '64',
            'notnull'  => true,
            'grid'     => true,
            'especial' => 'email',
            'description' => "O email será utilizado para fazer login e se comunicar com o site.",
         ),
        
        'senha' => array(
            'name'      => 'Senha',
            'type'      => 'varchar',
            'especial'  => 'senha',
            'size'      => '64',
            'notnull'   => true,
            'confirm'   => true,
            'private'   => true,
            'description' => "Digite uma senha contendo pelo menos 6 caracteres",
         ),
        
        'permissao' => array(
            'name'     => 'Tipo de Usuário',
            'type'     => 'enum',
            'default'  => 'Visitante',
            'options'  => array(
                'Webmaster' => 'Webmaster',
                'Admin'     => 'Admin',
                'Visitante' => 'Visitante'
            ),
            'permission' => 'usuario_GU',
            //'grid'     => false,
            'notnull'  => true,
            'private' => true,
            'description' => "O tipo de usuário define o acesso do usuário no sistema. <br/>
                <b>Usuários do tipo visitante</b> podem acessar as áreas em que o login é necessário. <br/>
                <b>Usuários do tipo Admin</b> podem modificar dados de configuração do site e podem acessar
                qualquer área e visualizar todos os dados, portanto cuidado ao atribuir alguém como admin",
       	 ),
        
        'cod_perfil' => array(
	    'name'     => 'Perfil de usuário',
	    'type'     => 'int',
	    'size'     => '11',
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
            //'private' => true,
	    'fkey' => array(
	        'model' => 'usuario/perfil',
	        'cardinalidade' => '1n',
	        'keys' => array('usuario_perfil_cod', 'usuario_perfil_nome'),
                'onupdate' => 'CASCADE',
                'ondelete' => 'RESTRICT',
	    ),
        ),
        
        'user_criadoem' => array(
	    'name'     => 'Data de Criação',
	    'type'     => 'timestamp',
	    'notnull' => true,
            'mobile_hide' => true,
            'default' => "CURRENT_TIMESTAMP",
            'especial' => 'hide'
        ),
        
        'user_uacesso' => array(
	    'name'        => 'Último Acesso',
	    'type'        => 'datetime',
            'especial'    => 'hide',
            'display'     => true,
        ),

        'status' => array(
            'name'     => 'Status',
            'type'     => 'enum',
            'especial' => 'hidden',
            'display' => true,
            'default'  => 'online',
            'options'  => array(
                'online'    => "Online", 
                'inativo'   => "Inativo", 
                'offline'   => "Offline",
                'bloqueado' => "Bloqueado"
            ),
            'notnull'  => true
       	 ),
        
        'confirmed' => array(
            'name'     => 'Confirmado',
            'type'     => 'enum',
            'private'  => true,
            'default'  => 'n',
            'options'  => array(
                'n'    => "Não", 
                's'    => "Sim", 
            ),
            'notnull'  => true
       	 ),
        
        'usuario_login_tutorial' => array(
	    'name'     => 'Tutorial',
	    'type'     => 'enum',
	    'default' => 'ativo',
            'notnull' => true,
	    'options' => array(
	    	'ativo' => 'ativo',
	    	'inativo' => 'inativo',
	    ),
            'private' => true
        ),
        
/*
        'foto' => array(
            'especial' => 'foto',
            'fkey' => array(
	        'model' => 'galeria/foto',
	        'cardinalidade' => '11',
	        'keys' => array('cod_foto', 'cod_foto'),
                'onupdate' => 'CASCADE',
                'ondelete' => 'RESTRICT',
	    ),
       	 ),*/
        
        'confirmkey' => array(
            'type'     => 'varchar',
            'especial' => 'hide',
            'size'     => '256',
            'private'  => true
       	 ),
        
        'update_permission' => array(
            'type'     => 'Permissão Atualizada',
            'especial' => 'hide',
            'type'     => 'enum',
            'private'  => true,
            'notnull'  => true,
            'default'  => 'n',
            'options'  => array(
                's' => "Sim",
                'n' => "Não"
            )
       	 ),
 
        'button' => array(
            'button' => "Salvar Usuário"
         )
    );
    
    public function atualizaStatus($cod = ""){
        $wh = ($cod != "")? "AND cod_usuario = '$cod'":"";
        $this->db->ExecuteQuery("
        update usuario set status = 'online'  WHERE status != 'bloqueado' AND ((NOW() - user_uacesso) <= 900 $wh);
        update usuario set status = 'inativo' WHERE status != 'bloqueado' AND ((NOW() - user_uacesso) > 900 AND (NOW() - user_uacesso) <= 3600 $wh);
        update usuario set status = 'offline' WHERE status != 'bloqueado' AND ((NOW() - user_uacesso) > 3600 OR isnull(user_uacesso) $wh);
        ");
    }

    public function setLastAccessOfUser(){
        if(!$this->IsLoged()) return;
        $horario = timeResource::getFormatedDate();
        parent::editar($this->getCodUsuario(), array('user_uacesso' => $horario));
    }

    public function getDados() {
        $var = parent::getDados();
        if($this->IsLoged()){
            $this->LoadModel('usuario/perfil', 'perfil');
            $var['cod_perfil']['default'] = $this->perfil->getDefaultPerfil();
        }
        if(!$this->UserIsAdmin()){
            $count = $this->getCount("permissao = 'Webmaster'");
            if($count != 0) {
                $var['permissao']['value']    = "Visitante";
                //$var['permissao']['value']    = "Admin";
                $var['permissao']['especial'] = 'hidden';
                $var['permissao']['type']     = 'varchar';
            }
            //else  $var['permissao']['default']  = "Webmaster";

        }elseif(!$this->UserIsWebmaster()){
            unset($var['permissao']['options']['Webmaster']);
        }

        if($this->UserIsWebmaster()){
            unset($var['permissao']['private']);
        }        
        return $var;
    }

    //verifica se o usuario está logado
    public function IsLoged(){
        return (cookie::cookieExists($this->cookie));
    }//c
    
     //desloga o usuario
    public function Logout(){
        
        $cod = $this->getCodUsuario();
        $total = $this->getCount("status = 'bloqueado' AND cod_usuario = '$cod'");
        $v['status'] = ($total != 0)?'bloqueado':'offline';
        
        //ao deslogar apaga todos os cookies
        cookie::destroyAll();
        
        return parent::editar($cod, $v);
    }//c
    
    public function IsEnabledTutorial(){
        $var = cookie::getVar($this->cookie);
        //print_r($var);//die();
        if($var != "") return($var['usuario_login_tutorial'] == 'ativo');
        else           return false;
    }
    
    public function disableTutorial(){
        $var = cookie::getVar($this->cookie);
        if($var == "") {
            $this->setErrorMessage('Usuário não está logado');
            return false;
        }
        $var['usuario_login_tutorial'] = "inativo";
        cookie::setVar($this->cookie, $var);
        
        $cod = $this->getCodUsuario();
        if($cod == 0) return;
        if(!parent::editar($cod, array('usuario_login_tutorial' => "inativo"))) {
            die($this->getErrorMessage());
            return false;
         }
        
        $this->setSuccessMessage('Tutorial Desativado com sucesso');
        return true;
    }
    
    public function enableTutorial(){
        
        $var = cookie::getVar($this->cookie);
        if($var == "") {
            $this->setErrorMessage('Usuário não está logado');
            return false;
        }
        $var['usuario_login_tutorial'] = 'ativo';
        cookie::setVar($this->cookie, $var);
        
        $cod = $this->getCodUsuario();
        if($cod == 0) return;
        if(!parent::editar($cod, array('usuario_login_tutorial' => 'ativo'))) {
            die($this->getErrorMessage());
            return false;
        }
        $this->setSuccessMessage('Tutorial Ativado com sucesso');
        return true;
    }
    
    public function userIsConfirmed($addevent = true){
        $var = cookie::getVar($this->cookie);
        if($var == "") return false;
        if($var['confirmed'] == '0'){
            if($addevent){
                $this->LoadResource('html', 'html');
                $url = $this->html->getLink("usuario/login/why_confirm");
                EventTube::addEvent('page-top', "<span id='erro'>
                    Caro Usuário o seu email ainda não foi confirmado 
                    <a href='$url'>saiba mais</a>
                 </span>");
            }
            return false;
        }
        return true;
    }

    public function resend_confirmation(){
        $id = $this->getCodUsuario();
        $var = $this->getItem($id);
        if($var['confirmkey'] == ""){
            $v['confirmkey'] = genKey(16);
            if(!parent::editar($id, $v)){
                $this->setErrorMessage('
                    Não foi possível gerar uma nova chave de confirmação para sua conta.
                ');
                return false;
            }
            $var['confirmkey'] = $v['confirmkey'];
        }
        $this->LoadModel('usuario/login/loginDialogs', 'udi');
        $bool = $this->udi->resend_confirmation($var);
        $this->setMessages($this->udi->getMessages());
        return $bool;
    }

    public function getCodUsuario($user = array()){
        if(empty($user)){
            $var = cookie::getVar($this->cookie);
            if($var != "") return(!isset($var['cod_usuario']))?0:$var['cod_usuario'];
            else return 0;
        }
        
        if(is_array($user)){
            if(isset($user['cod_usuario'])) return $user['cod_usuario'];
            else                            return 0;
        }
        
        $row = (is_numeric($user))?'cod_usuario':'email';
        $it = $this->getItem($user, $row, false, array('cod_usuario'));
        if(empty($it)) return 0;        
        return $it['cod_usuario'];
        
    }//c
    
    public function getUserNick($user = array(), $show_in_array = false){
        if(empty($user)){
            $var = cookie::getVar($this->cookie);
            if(empty($var)){
                if($show_in_array) return array();
                else return '';
            }
            $user = $var;
            unset($user['user_cargo']);
        }
        
        if(!array_key_exists('user_name', $user)){
            if(!$show_in_array) return $user['email'];
            return $user;
        }
        if(!$show_in_array){ 
            $cargo = (isset($user['user_cargo']) && $user['user_cargo'] != "") ?" (".$user['user_cargo'].")":"";
            $append  = "";
            if(isset($user['img'])) $append .= "<img src=\'".$user['img']."\' class=\'profile_picture\' />";
            $append .= "<div class=\'profile_info\' >".$user['user_name']. $cargo."</div>";
            return "<div class=\'profile\'>$append</div>";
        }
        
        $user['user_cargo'] = (isset($user['user_cargo']) && $user['user_cargo'] != "") ?$user['user_cargo']:"";
        $user['img']        = (isset($user['img']))      ? "<img src=\'".$user['img']."\' class=\'profile_picture\' />":"";
        $user['user_name']  = (isset($user['user_name']))? $user['user_name']:$user['email'];
        return $user;
        
    }//c
    
    public function getUserData(){
        return cookie::getVar($this->cookie);
        
    }//c

    /*faz o login do usuario*/
    public function Login($login, $senha, $enc = true){

        //procura no banco de dados um usuário e senha iguais ao digitado pelo usuário
        $login = str_replace(array("'", '"'), "", $login);
        $senha = str_replace(array("'", '"'), "", $senha);
        $where = (!$enc)? "`email` = '$login' AND `senha` = '$senha'": "`email` = '$login' AND `senha` = PASSWORD('$senha')";
        $value = $this->db->Read($this->tabela, NULL, $where);
        
        //se login não existe ou senha está incorreta
        if(empty ($value)){
            $this->setErrorMessage("Usuário ou senha incorretos");
            return false;
        }

        //verifica se o usuário está bloqueado
        $user = array_shift($value);
        if($user['status'] == 'bloqueado'){
            throw new AcessDeniedException("O seu acesso foi bloquado por um administrador do sistema!");
            return false;
        }
        
        //seta os dados a serem salvos na sessão
        $var['cod_usuario']            = $user['cod_usuario'];
        $var['email']                  = $user['email'];
        $var['usuario_login_tutorial'] = $user['usuario_login_tutorial'];
        $var['user_name']              = $user['user_name'];
        $var['user_cargo']             = $user['user_cargo'];
        $var['confirmed']              = @$user['confirmed'];
        
        //cria a sessão do usuario 
        $refer = cookie::getVar('refer');
        cookie::destroyAll();
        cookie::setVar($this->cookie, $var);
        if($refer != "") {cookie::setVar('refer', $refer);}
        
        //seta os dados a serem editados
        $v['status']     = 'online';
        if($user['confirmkey'] != ""){
            $recsenha = encrypt::decrypt_camp($user['confirmkey']);
            if($recsenha != $user['confirmkey']) $v['confirmkey'] = "FUNC_NULL";
        }
        
        //edita os dados
        parent::editar($user['cod_usuario'], $v);
        
        //redireciona, caso necessário
        $this->Redirect(true);
        
        return true;
    }//c
    
    //insere um novo usuario
    public function inserir($array){

        $this->user_permission($array);

        //dados extras(do sistema)
        if(!isset($array['senha'])){
            $array['senha'] = genKey(12);
        }
        $senha               = $array['senha'];
        $array['cod_perfil'] = isset($array['cod_perfil'])?$array['cod_perfil']:'1';
        $array['senha']      = 'FUNC_PASSWORD("'.$senha.'")';
        $array['confirmkey'] = genKey(16);	
        
        if(!parent::inserir($array)) return false;
        $user = $this->getItem($array['email'], 'email');
        $user['senha'] = $senha;
        
        //responsavel pelas mensagens para o usuario
        $this->LoadModel('usuario/login/loginDialogs', 'udi');
        $bool = $this->udi->inserir($user);
        $this->setMessages($this->udi->getMessages());
        return $bool;

    }//c
    
    public function editarDados($id, $dados){
        $var = $this->selecionar(array('cod_usuario'), "`cod_usuario` = '$id' AND `senha` = PASSWORD('".$dados['senha']."')");
        if(empty($var)){
            $this->setErrorMessage("Caro usuário, sua senha está incorreta!");
            return false;
        }
        return $this->editar($id, $dados);
    }//c
    
    public function getAutenticatedUser($cod_usuario, $senha){
        $user = $this->selecionar(array(), "cod_usuario = '$cod_usuario' AND senha = PASSWORD('$senha')");
        if(empty($user)) return $user;
        return array_shift($user);
    }
    
    private function user_permission(&$dados){
        
        //se não existe nenhum webmasters, seta a permissão de webmaster
        $count = $this->getCount("`permissao` = 'Webmaster'");
        if($count == 0){
            $dados['permissao'] = 'Webmaster';
            return;
        }
        if(!isset($dados['permissao'])) return;
        
        //se usuário não é admin a permissão só pode ser de visitante
        //if(!$this->UserIsAdmin()) $dados['permissao'] = 'Visitante';
        if(!$this->UserIsAdmin()) $dados['permissao'] = 'Admin';
        
        //se usuário é admin mas não é webmaster só pode criar um novo admin ou um novo visitante
        elseif(!$this->UserIsWebmaster() && ($dados['permissao'] == "Webmaster")){
            //$dados['permissao'] = "Visitante";
            $dados['permissao'] = "Admin";
        }
    }

    public function editar($id, $dados, $camp = ""){

        function redirectToIdentidade($dados){
            if(LINK ."/".CURRENT_ACTION != "usuario/login/edit"){
                $var['post'] = $dados; 
                $var["url"] = CURRENT_PAGE;
                cookie::setVar('guard', $var);
                Redirect("usuario/login/identidade");
            }
        }
        
        $temp = cookie::getVar('guard');
        if(!isset($dados['senha'])){
            if(cookie::cookieExists('guard')){
                if(isset($temp['senha'])) $dados['senha'] = $temp['senha'];
            }
            if(!isset($dados['senha'])) redirectToIdentidade($dados);
        }
        
        $camp = ($camp == "")?$this->pkey:$camp;
        $where = (LINK ."/".CURRENT_ACTION != "usuario/login/edit")?"AND senha = PASSWORD('".$dados['senha']."')":'';
        $user = $this->selecionar(array(), "$camp = '$id' $where");
        if(empty($user)){
            $user = $this->getItem($id, $camp);
            if(!empty($user)) redirectToIdentidade($dados);
            else              $this->setErrorMessage("Usuário ou senha incorretos");
            return false;
        }
        
        if(isset($dados['senha_nova'])){
            if($dados['senha_nova'] != $dados['confirmar_senha']){
                $this->setErrorMessage("A senha nova deve ser idêntica à confirmação de senha");
                return false;
            }
        }
        
        $this->user_permission($dados);
        if(isset($dados['senha'])) unset($dados['senha']);
        if(array_key_exists('senha_nova', $dados)) $dados['senha'] = 'FUNC_PASSWORD("'.$dados['senha_nova'].'")';
        
        if(!empty($temp)){
            $_POST = $temp['post'];
            $_POST['senha'] = $temp['senha'];
            cookie::destroy('guard');
        }
            
        if($this->getCodUsuario() == $id && isset($dados['cod_perfil']))
            unset($dados['cod_perfil']);
        
        $old = $this->getItem($id);
        
        //seta as variaveis de controle
        $dados['update_permission'] = 's';
        if(isset($dados['email'])&& isset($user['email']) && $user['email'] != $dados['email'])
            $dados['confirmed'] = '0';
        
        if(!parent::editar($id, $dados, $camp)) return false;
        $user = $this->getItem($id);
        
        $this->LoadModel('usuario/login/loginDialogs', 'udi');
        $bool = $this->udi->editar($user, $old);
        $this->setMessages($this->udi->getMessages()); 
        cookie::destroy('guard');
        return $bool;
    }//c
    
    public function apagar($valor, $chave = "") {
        $user = $this->getItem($valor, $chave);
        
        //impede que o usuário se exclua
        if($this->getCodUsuario($user) == $this->getCodUsuario()){
            $this->setErrorMessage("Você não pode excluir sua própria conta!");
            return false;
        }
        
        //se usuário a ser excluido é webmaster
        elseif($user['cod_perfil'] == Webmaster){
            
            //se o usuário que está excluindo um webmaster não for webmaster, então bloqueia
            if($this->getCodPerfil() != Webmaster){
                $this->setErrorMessage("Você não tem permissão de excluir um Administrador do Sistema!");
                return false;
            }

            //se quem está excluindo um webmaster é um webmaster
            else{
                
                //se só existe um webmaster, bloqueia
                $total = $this->getCount("cod_perfil = '".Webmaster."'");
                if($total == 1){
                    $this->setErrorMessage("Para excluir uma conta de Webmaster é necessário 
                        que exista pelo menos outra conta com o mesmo privilégio");
                    return false;
                }
            }
        }
        
        //apaga
        if(!parent::apagar($valor, $chave)) return false;
        $name = $user['user_name'] . " (".$user['user_cargo'].")";
        $this->setSuccessMessage("Usuário $name removido do sistema com sucesso!");
        return true;
    }

    public function Confirm($dados){

        $dados   = explode("-", $dados);
        $usuario = array_shift($dados);
        $chave   = array_shift($dados);
        $usuario = $this->antinjection($usuario, false);
        
        //procura o usuario no banco de dados
        $value = $this->db->Read($this->tabela, NULL, "`cod_usuario` = '$usuario'", 1); 
        if(empty($value)){
            $this->setErrorMessage("O usuário que você procura não existe");
            return false;
        }
        
        //verifica se é necessário atualizar a session do usuário
        $user            = array_shift($value);
        $online          = $this->IsLoged();
        $codUserOnline   = $this->getCodUsuario();
        $codUserConfirm  = $this->getCodUsuario($user);
        $atualizaSession = ($online === true && $codUserOnline == $codUserConfirm && cookie::cookieExists($this->cookie))?true:false;
        
        //recupera o nome do usuário que está sendo recuperada a session
        $name            = $this->getUserNick($user);
        
        //se a chave de confirmacao esta vazia
        if($user['confirmkey'] == ""){
            if($atualizaSession){
                $co = cookie::getVar($this->cookie);
                $co['confirmed'] = '1';
                cookie::setVar($this->cookie, $co);
            }
            $this->setErrorMessage("O usuário $name foi confirmado no site anteriormente!");
            return false;
        }
        
        //se a chave de confirmacao esta errada
        if($user['confirmkey'] != $chave){
            $this->setErrorMessage("A chave de confirmação do usuário $name está incorreta!");
            return false;
        }
        
        //edita o usuário no banco de dados
        $Var['confirmkey'] = "FUNC_NULL";
        $Var['confirmed'] = "1";
        if(!parent::editar($user['cod_usuario'], $Var)){
            $this->setErrorMessage("Não foi possível confirmar o usuário $name");
            return false;
        }
        
        //atualiza a session se necessário
        if($atualizaSession){
            $co = cookie::getVar($this->cookie);
            $co['confirmed'] = '1';
            cookie::setVar($this->cookie, $co);
        }
        
        //atualiza as mensagens
        $this->setSuccessMessage("Usuário $name confirmado com sucesso!");
        cookie::setVar('controller_alerts', $this->getMessages());
        
        //se usuário não está online e não existe outra sessão de usuário online, faz o login do usuário
        if(!$online) $this->Login(@$user['email'], @$user['senha'], false);
        return true;

    }//c

    public function RecoverPassword($email){

        //procura o usuario no banco de dados
        $value = $this->db->Read($this->tabela, NULL, "`email` = '$email'");
        if(empty($value)){
            $this->setErrorMessage("Este email não está registrado em nossa base de dados");
            return false;
        }
        $user = array_shift($value);
        
        /*
        Edita os dados no banco
        Se confirmkey estiver encriptada, então ela contém a nova senha do usuário. 
        Do contrário gera uma nova chave de confirmação
         */
        $confkey = ($user['confirmkey'] != "")?$user['confirmkey']:genKey(16);
        $Var['confirmkey'] = $confkey;
        if(!parent::editar($user['cod_usuario'], $Var)) return false;

        if($confkey == $user['confirmkey'] && strlen($confkey) > 16) $confkey = "";
        
        //envia um alerta por email ara o usuário
        $this->LoadModel('usuario/login/loginDialogs', 'udi');
        $bool = $this->udi->RecoverPassword($user, $confkey);
        $this->setMessages($this->udi->getMessages());
        return $bool;
    }

    //confirma a recuperação de senha
    public function ConfirmRecoverPassword($dados){

        $dados   = explode("-", $dados);
        $usuario = array_shift($dados);
        $chave   = array_shift($dados);

        //verifica se existe algum usuario com esta chave de recuperação
        $value = $this->db->Read($this->tabela,NULL, "`cod_usuario` = '$usuario' AND`confirmkey` = '$chave'");
        $user = array_shift($value);
        if(empty ($user)){
            $value = $this->db->Read($this->tabela, NULL, "`cod_usuario` = '$usuario'");
            
            //verifica se usuário existe
            $user = array_shift($value);
            if(empty ($user)) {
                $this->setErrorMessage("Usuário não existe");
                return false;
            }
            
            //verifica se a chave de confirmação existe
            elseif(array_key_exists("confirmkey", $user) && $user['confirmkey'] != "") {
                
                //verifica se a chave de confirmação contém a nova senha do usuário
                if($user['confirmkey'] == encrypt::decrypt_camp($user['confirmkey'])){
                    $this->setErrorMessage("Chave de confirmação inválida.");
                    return false;
                }
            }
            
            else{
                $this->setSuccessMessage('Usuário já confirmado');
                return true;
            }
            
        }

        //carrega a senha gerada
        if(isset($user['confirmkey'])){
            $dec = encrypt::decrypt_camp($user['confirmkey']);
            $senha = ($dec != $user['confirmkey'])? $dec:genKey(12);
        }else $senha = genKey(12);
        $Var['senha']      = "FUNC_PASSWORD('".$senha."')";
        $Var['confirmkey'] = encrypt::encrypt_camp($senha);
        if(!$this->db->Update($this->tabela, $Var, "`cod_usuario` = '".$user['cod_usuario'] ."'")){
            $this->setErrorMessage("Não foi possível gerar sua nova senha");
            return false;
        }

        $this->LoadModel('usuario/login/loginDialogs', 'udi');
        $bool = $this->udi->ConfirmRecoverPassword($user, $senha);
        $this->setMessages($this->udi->getMessages());
        return $bool;
    }
    
    public function resend($login){
    	
    	//procura o usuario no banco de dados
        $value = $this->db->Read($this->tabela, NULL, "`cod_usuario` LIKE '$login' || `email` LIKE '$login'"); 
        if(empty($value)){
            $this->setErrorMessage("Usuário inexistente");
            return false;
        }
        $value = array_shift($value);
        
        if($value['confirmkey'] == NULL || $value['key'] == ""){
            $this->setSuccessMessage("Email já confirmado");
            return true;
        }
        
        $Var['confirmkey'] = $value['key'];

        //Se nao conseguiu atualizar tabela
        if(!$this->db->Update($this->tabela, $Var, "`cod_usuario` = '".$value['cod_usuario'] ."'")){
            $this->setErrorMessage("Não foi possível atualizar o banco de dados");
            return false;
        }

        //prepara o email
        $this->LoadResource("html", 'html');
        $url     = $this->html->getLink("usuario/login/confirmar/".$value['cod_usuario']."/".$Var['confirmkey']);
        $msg     = "<p><a href='$url'>clique aqui</a> Para completar sua inscrição</p>";
        $assunto = "Reenviar Confirmação";
        $corpo   = $msg;
        
        $this->LoadResource("email", "email");
        $this->email->SendMail($assunto, $corpo, $value['email']);

        $this->setSuccessMessage("Um novo email de confirmação foi enviado para você.");
        return true;
    }
    
    public function needWebmasterLogin(){
        
        //se usuário não está logado ou não é admin
        if(!$this->IsLoged() || !$this->UserIsWebmaster()){
            $this->Logout();
            $this->needLogin();
        }
        
        //se usuário é admin
        else $this->Redirect();
        return true;
    }
    
    public function needAdminLogin(){
        
        //se usuário não está logado ou não é admin
        if(!$this->IsLoged() || !$this->UserIsAdmin()){
            $this->Logout();
            $this->needLogin();
        }
        
        //se usuário é admin
        else $this->Redirect();
        return true;
    }
    
    public function needLogin(){
        if(!$this->IsLoged()){
            if(strpos(CURRENT_URL, '.') === false){
                $this->LoadResource('html', 'html');
                $url = base64_encode($this->html->getLink(CURRENT_URL));
                if(!cookie::cookieExists('refer'))cookie::setVar('refer', $url);
                Redirect('usuario/login', 0, "refer=$url");
            }
            Redirect('usuario/login');
        }
        else $this->Redirect();
        return true;
    }
    
    public function Redirect($first_login = false){
        $refer = "";
        if(isset($_GET['refer'])) $refer = $_GET['refer'];

        if(cookie::cookieExists('refer')){
            if($refer == "") $refer = cookie::getVar('refer');
            cookie::destroy('refer');
        }

        if($refer == "" && $first_login){
            $this->LoadModel("plugins/plug", "plug");
            $default = $this->plug->getDefault();
            try{
                $this->plug->IsAvaible($default); 
                $refer = base64_encode(URL.$default);
            }
            catch (PageNotFoundException $pne){
                if($this->UserIsAdmin()) $refer = base64_encode(URL.'admin/index.php?url='.$default);
                else $refer = base64_encode(URL.'usuario/index.php?url=usuario/home');
            }
        }
        
        if($refer != ""){
            $refer = base64_decode($refer);
            $arr['status']  = "1";
            $arr['success'] = "Login efetuado com sucesso! Autenticando... ";
            SRedirect($refer, 0, $arr);
        }
        return false;
    }
    
    public function getUserId(){
        $var = cookie::getVar($this->cookie);
        if($var == "") return "";
        
        $cod_usuario = $var['cod_usuario'];
        $item = ($this->getItem($cod_usuario));
        if(!array_key_exists("cod_usuario", $item) || $cod_usuario != $item['cod_usuario']){
            return "";
        }
        return $cod_usuario;
    }

    public function UserIsWebmaster($cod_usuario = ''){
        return $this->UserIsAdmin($cod_usuario, $perm = "Webmaster");
    }
    
    public function UserIsAdmin($cod_usuario = "", $perm = ""){
        $var = cookie::getVar($this->cookie);
        if($var == "") return false;
        $cod_usuario = ($cod_usuario == "")?$var['cod_usuario']:$cod_usuario;
        $item = ($this->getItem($cod_usuario, '', false, array('cod_usuario', 'permissao')));
        //print_r($item); die();
        if(empty($item)) return false;
        
        if(!array_key_exists("cod_usuario", $item) || $cod_usuario != $item['cod_usuario'])return false;
        if($perm == "") return ($item['__permissao'] == "Webmaster" || $item['__permissao'] == "Admin");
        else            return ($item['__permissao'] == $perm);
    }
    
    public function LoadPerfil($cod){
        if($cod == "") return array();
        $item = $this->uobj->getItem($cod);
        //echo $this->db->getSentenca();
        if(empty ($item)) return $item;
        unset($item['newslatter']);
        unset($item['senha']);
        unset($item['permissao']);
        unset($item['confirmkey']);
        return $item;
    }
    
    public function getCodPerfil($cod_usuario = ""){
        if(!$this->IsLoged())return "";
        
        $cod_user = ($cod_usuario == "") ?$this->getCodUsuario():$cod_usuario;
        $user = $this->selecionar(array('cod_perfil'), "cod_usuario='$cod_user'");
        if(empty($user)) return "";
        $us = array_shift($user);
        return $us['cod_perfil'];
    }
    
    public function getUsuariosPorPerfil($cod_perfil, $onlycod = false){
        $campos = ($onlycod)?array('cod_usuario'):$this->getCampos();
        return $this->selecionar($campos, "cod_perfil = '$cod_perfil'");
    }
    
    public static function CodUsuario(){
        $var = cookie::getVar(usuario_loginModel::$__cookie);
        if($var != "") return $var['cod_usuario'];
        else           return 0;
    }
    
    
    
    public function blockUser($cod_usuario){
        if($this->getCodPerfil($cod_usuario) == Webmaster){
            $this->setErrorMessage("Não é possível bloquear um usuário com permissão de Webmaster");
            return false;
        }
        $bool = parent::editar($cod_usuario, array('status' => 'bloqueado', 'update_permission' => 's'));
        if(!$bool) $this->setErrorMessage("Não foi possível bloquer o acesso a este usuário");
        else       $this->setSuccessMessage ('Usuário bloqueado com sucesso!');
        return $bool;
    }
    
    public function unblockUser($cod_usuario){
        $bool = parent::editar($cod_usuario, array('status' => 'offline', 'update_permission' => 's'));
        if(!$bool) $this->setErrorMessage("Não foi possível desbloquer o acesso deste usuário");
        else       $this->setSuccessMessage ('Usuário desbloqueado com sucesso!');
        return $bool;
    }
    
    public function isBloqued(){
        if($this->getCodPerfil() == Webmaster) return false ;
        $cod_usuario = $this->getCodUsuario();
        $total = $this->getCount("cod_usuario = '$cod_usuario' AND status = 'bloqueado'");
        return ($total != 0);
    }
    
    
    
    public function permissoes_alteradas($cod_perfil){
        parent::editar($cod_perfil, array('update_permission' => 's'), 'cod_perfil');
    }
    
    public function has_permission_alterada($cod_usuario = ""){
        if($cod_usuario == "") $cod_usuario = $this->getCodUsuario ();
        if($cod_usuario == 0) return false;
        $total = $this->getCount("cod_usuario = '$cod_usuario' AND update_permission = 's'");
        return ($total != 0);
    }
    
    public function isUpdatedPermissions(){
        $cod_usuario = $this->getCodUsuario ();
        if($cod_usuario == 0) return false;
        parent::editar($cod_usuario, array('update_permission' => 'n'));
    }
    
    public function UserCanAlter($cod_usuario){
        $cod_autor = $this->getCodUsuario();
        if($cod_autor == $cod_usuario) return true;
        
        $cod_perfil = $this->getCodPerfil($cod_usuario);
        
        //Somente um webmaster pode editar o próprio perfil
        if($cod_perfil == Webmaster){
            $this->setErrorMessage('Você não tem permissão para modificar um usuário com perfil de Webmaster!');
            return false;
        }
        
        //webmaster pode alterar os outros perfis
        $cod_perfil2  = $this->getCodPerfil($cod_autor);
        if($cod_perfil2 == Webmaster) return true;
        
        //somente um administrador pode editar um perfil de administrador
        if($cod_perfil == Admin && $cod_perfil2 != $cod_perfil) {
            $this->setErrorMessage('Você não tem permissão para modificar um usuário com perfil de Administrador!');
            return false;
        }
        return true;
    }
    
    public function paginate($page, $link = "", $cod_item = "", $campo = "", $qtd = 20, $campos = array(), $adwhere = "", $order = "") {
        $order = ($order == "")?"status ASC, user_name ASC":$order;
        return parent::paginate($page, $link, $cod_item, $campo, $qtd, $campos, $adwhere, $order);
    }
    
}

?>